// 传入的key类型, obj当中key的其中之一
interface IKun {
  name: string;
  age: number;
}

type IKunKeys = keyof IKun; // "name"|"age"

// interface a extends b。 b是接口对象时，a是含有b所有属性且可扩展其它属性的对象
// extends一个对象类型，说明该泛型拥有该对象类型的属性 **实际传入类型 必在该联合类型内**
// 此处 extends一个联合类型，说明**实际传入类型 必在该联合类型内**
function getObjectProperty<O, K extends keyof O>(obj: O, key: K) {
  return obj[key];
}

const info = {
  name: "why",
  age: 18,
  height: 1.88,
};

const name = getObjectProperty(info, "name");

// *********回顾interface的extends**********
interface IKun2 {
  name: string;
  age: number;
}

// 在ikun2的基础上增加属性
interface Ikun3 extends IKun2 {
  sing: () => void;
}

let ikun: Ikun3 = {
  name: "why",
  age: 18,
  sing: () => {},
};

export {};
